home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Mac Game Programming Gurus / TricksOfTheMacGameProgrammingGurus.iso / More Source / C⁄C++ / AsychSound / AsynchSound.c next >
Text File  |  1994-11-09  |  2KB  |  66 lines

  1. void
  2. PlaySoundFile(FSSpec *fss)
  3. {
  4.     OSErr           err;
  5.     short           refNum;
  6.     ulong           srcSize;
  7.     HParamBlockRec  pb;
  8.     Handle          sndHandle;
  9.     ulong           maxblock = MaxBlock() - (32 * 1024);
  10.     short           id;
  11.     long            type;
  12.     Str255          name;
  13.     SCStatus        status;
  14.  
  15.     if (SndNewChannel(&sndChannel, sampledSynth, 0, nil) != noErr) {
  16.         SysBeep(1);
  17.         return;
  18.     }
  19.  
  20.     SetResLoad(false);
  21.     if ((refNum = HOpenResFile(fss->vRefNum, fss->parID,
  22.          fss->name, fsRdPerm)) == -1) {
  23.         SysBeep(1);
  24.         return;
  25.     }
  26.     sndHandle = Get1IndResource('snd ', 1);
  27.     if (sndHandle == nil) {
  28.         SysBeep(1);
  29.         return;
  30.     }
  31.  
  32.     GetResInfo(sndHandle, &id, &type, name);
  33.     srcSize = MaxSizeRsrc(sndHandle);
  34.     SetResLoad(true);
  35.     
  36.     if (srcSize < maxblock) {
  37.         dataHandle = Get1Resource('snd ', id);
  38.         DetachResource(dataHandle);
  39.         HLock(dataHandle);
  40.     } else {
  41.         dataHandle = TempNewHandle(srcSize, &err);
  42.         if (dataHandle == nil) {
  43.             SysBeep(1);
  44.             return;
  45.         }
  46.         HLock(dataHandle);
  47.         ReadPartialResource(sndHandle, 0, *dataHandle, srcSize);
  48.         if (ResError() != noErr)
  49.             Debugger();
  50.     }
  51.  
  52.     CloseResFile(refNum);
  53.     SndPlay(sndChannel, dataHandle, true);
  54.     
  55.     do {
  56.         WasteTime(15);
  57.         SndChannelStatus(sndChannel, sizeof(SCStatus), &status);
  58.     } while (status.scChannelBusy == true);
  59.     
  60.     SndDisposeChannel(sndChannel, true);
  61.     sndChannel = nil;
  62.     quitting = true;
  63.     DisposeHandle(dataHandle);
  64.     dataHandle = nil;
  65. }
  66.